package model.common.template;

import java.util.List;

import model.common.root.Element;

/** The TemplateSignature of a template defines a set of TemplateParameters that may be bound to actual model Elements in a bound
element for the template. A bound element is a TemplateableElement that has one or more such TemplateBindings.<p>
 
The TemplateParameters for a TemplateSignature specify the formal parameters that will be substituted by actual parameters (or
the default) in a binding. A TemplateParameter is defined in terms of a ParameterableElement contained within the template that
owns the TemplateSignature of which the TemplateParameter is a part. Such an element is said to be exposed by the
TemplateParameter.<p>

An exposed ParameterableElement may be owned, directly or indirectly, by the template or it may be owned by the
TemplateParameter itself, in situations in which the element does not otherwise have an ownership association within the
template model. In either case, the ParameterableElement is meaningful only within the context of the template—it will be
effectively replaced by an actual Element in the context of a binding. Thus, a ParameterableElement exposed by a
TemplateParameter cannot be referenced outside its owning template or other templates that have access to the internals of the
original template (e.g., if the template is specialized). Subclasses of TemplateSignature can also add additional rules that constrain
what sort of ParameterableElement can be used for a TemplateParameter in the context of a particular kind of template.<p>

A TemplateParameter may also reference a ParameterableElement as the default for this formal parameter in any TemplateBinding
that does not provide an explicit TemplateParameterSubstitution for the parameter. Similarly to an exposed
ParameterableElement, a default ParameterableElement may be owned either directly by the template or by the
TemplateParameter itself. The TemplateParameter may own this default ParameterableElement even in situations where the
exposed ParameterableElement is not owned by the TemplateParameter.*/
public class TemplateSignature extends Element {

	// Attributes
	private TemplateableElement template;
	
	private List<TemplateParameter> ownedParameter;
	
	private List<TemplateParameter> parameter;
}
